#include "../../include/thread/threadHandle.h"
#include <string.h>
#include <syslog.h>
#include "boost/format.hpp"
#include <sys/socket.h>
#include "../../include/thread/threadHandle.h"
#include "../../include/global.h"
#include "../../include/machine/CJsonOper.h"

//后台处理线程，负责处理每条接收到的数据
void ThreadTaskHanlde(int sock_fd, char* data, int len)
{
    int socketFd = sock_fd;                 //socketfd
    std::string dataRecv = data;
    std::string dataSend;          //收发数据
    boost::format fmt;
    std::string msg;

    //开始处理数据
    fmt = boost::format("客户端[%d],开始处理数据");
    fmt %sock_fd;
    syslog(LOG_INFO,fmt.str().c_str());

    //数据处理过程
    {
        //解析json数据
        CJsonOper jsonOper;
        int cmd = jsonOper.GetCMD(dataRecv);
        if(cmd == CJsonOper::CMD_UPDATE_MACHINE_DATA)       //更新机器数据
        {
            unsigned int machID = 0;
            CMachineData machData;

            //获取机器数据
            if(!jsonOper.GetMachData(dataRecv,machID,machData))
            {
                std::string strTemp = jsonOper.GetErrMsg();

                //组织回包
                dataSend = jsonOper.GenUniversalNG(strTemp);
            }
            else
            {
                CMachine *pMach = gMachGroup.GetMachineByID(machID);
                if(pMach)
                {
                    //开始处理
                    pMach->HandleData();

                    //处理数据
                    dataSend = jsonOper.GenUniversalOK();
                }
                else
                {
                    fmt = boost::format("指定设备号[%d]不存在");
                    fmt %machID;
                    msg = fmt.str();
                    syslog(LOG_ERR,msg.c_str());
                    dataSend = jsonOper.GenUniversalNG(msg);
                }                
            }           
        }
    }

    //发送回包给客户端
    fmt = boost::format("客户端[%d],数据处理完成，准备发送数据");
    fmt %sock_fd;
    syslog(LOG_INFO,fmt.str().c_str());

    //结果发送到数据发送线程
    DATA_SEND struData(socketFd, dataSend);
    std::unique_lock<std::mutex> lk(gmtDataSend);
    gcvDataSend.wait(lk,[](){return gQueDataSend.size() < 10?true:false;});
    gQueDataSend.emplace(struData);
    gcvDataSend.notify_all();

    fmt = boost::format("客户端[%d]，数据发送完成");
    fmt %sock_fd;
    syslog(LOG_INFO,fmt.str().c_str());
}